package com.shujia.base.day02

/**
 * scala是基于java封装的语言，所以也具备面向对象的特点，封装，继承，多态
 * 这里基本上都满足java的特点。
 *
 * 注意事项：
 * 1、每一个类必须要有一个主构造方法，在类上面直接定义
 * 2、scala中的类的构造方法，也可以发生重载
 * 3、除了在类上面定义的主构造方法以外，在类中定义的其他this构造方法都属于辅助构造方法
 * 4、辅助构造方法第一句话，必须要调用主构造方法
 * 5、scala类中的方法也可以进行方法重写，但是必须要加上一个关键字 override
 * 6、定义主构造方法的时候，成员变量默认是不允许直接获取的
 * 7、若一个类被object修饰，那么编译过程中会产生两个文件一个带$一个不带，带$的文件中会自动创建一个该类的对象
 * 8、若一个类只是被class修饰，那么编译过程中只会一个对象的class文件，如果要调用对象中的方法，需要自己在程序中new出来。
 */
object Demo7Class {
  def main(args: Array[String]): Unit = {
    //    val s1: Student = new Student()
    //    val s2: Student = new Student()
    //    val s1: Student = new Student("张三", 18)
    //    val s2: Student = new Student()

    val s1: Student = new Student("张三", 18)
    println(s"s1: ${s1}") // 直接打印对象名和java中一样，获取的是当前对象的地址值,默认调用的是父亲中的toString方法

    //    s1.name // 成员变量默认是不允许直接获取的
    //    println(s"姓名：${s1.name}")

    //    s1.name = "李四"
    s1._name = "李四" // 若主构造方法上的变量被var修饰的话，就可以修改成员变量值
    println(s"s1: ${s1}")


  }
}

/**
 * 一个标准类中的三大成员：构造方法，成员变量，成员方法
 *
 * 构造方法：
 * 主构造方法：将成员变量定义在类上，一个类本身就作为一个构造方法。
 * 辅助构造方法：
 */
//class Student { // 类的大括号，就看作主构造方法的方法体。
//  println("hello world!")
//}

/**
 * 主构造方法为：Student(name: String, age: Int)
 */
//class Student(var _name: String, _age: Int) {
//  //定义成员变量
//  def name:String = _name
//  var age:Int = _age
//
//  // 辅助无参构造方法
//  def this(){
//    this("默认姓名",18) // 必须要调用主构造方法
//  }
//
//  def setAge(a:Int):Unit={
//    age = a
//  }
//
//
//  //重写toString
//  override def toString: String = s"姓名:${_name}, 年龄:${_age}"
//}

class Student(var _name: String, var _age: Int) {
  // 辅助无参构造方法
  def this() {
    this("默认姓名", 18) // 必须要调用主构造方法
  }

  //重写toString
  override def toString: String = s"姓名:${_name}, 年龄:${_age}"
}
